import Vue from 'vue';
import Vuex from 'vuex';
//在 Vuex 的 actions 中，this 并不指向 Vue 实例，所以无法直接使用 this.$myRequest。所以需要将 myRequest 导入到 Vuex 模块中并直接使用它。
import {myRequest} from '@/util/api.js'
Vue.use(Vuex);

//用户相关模块
const userAbout = {
	namespaced: true, //开启命名空间
	state: {
		userInfo: {},
	},
	mutations: {
		//用户登录成功后，将用户信息存入state，只要用户没有退出登录，
		//再次进入应用时，还会调用该函数，将用户信息存入state
		setUserInfo(state, info) {
			state.userInfo = info;
			//将用户信息同步存入本地缓存，避免应用刷新后用户信息丢失
			uni.setStorageSync('userInfo', info)
		},
		clearUserInfo(state) {
			state.userInfo = {};
			uni.removeStorageSync('userInfo')
		}
	},
	actions: {
		//执行异步的方法myRequest
		async login({commit}, loginData) {
			try {
				const res = await myRequest({
					method: 'POST',
					url: '/api/user/login',
					data: {
						username: loginData.username,
						password: loginData.password,
					}
				})

				//只有在res返回登录正确的反馈，才将用户信息存入state。但不论是否正确登录，都要返回给前端一个结果，前端根据结果作进一步判断提示
				return res;
			} catch (error) {
				console.error('登录请求失败:', error);
				// 这里可以根据具体需求添加更多的错误处理逻辑
				// 例如，向用户显示错误提示
				uni.showToast({
					title: '登录失败',
					icon: 'none'
				});
				return null;
			}
		},
		setUser({commit}, userInfo) {
			commit('setUserInfo', userInfo);
		},
		clearUser({commit}, user) {
			commit('clearUserInfo', user)
		}
	},
	getters: {
		getUserInfo(state) {
			return state.userInfo;
		}
	}
}

//购物车相关模块
const cartAbout = {
	namespaced: true, //开启命名空间
	state: {
		cartInfo: {
			goodsCount: 0,
			cartList: []
		}
	},
	mutations: {
		ADDCART(state, goodObj) {
			state.cartInfo.goodsCount++;
		},
		SETCART(state, list) {
			state.cartInfo.cartList = [];
			// console.log('list', list)
			list.forEach((item) => {
				state.cartInfo.cartList.push({
					productId: item.productId,
					detailId: item.detailId,
					userId: userAbout.state.userInfo.id,
					quantity: item.quantity,
					checked: item.checked,
				})
			})
			state.cartInfo.goodsCount = list.length
			uni.setStorageSync('cartInfo', state.cartInfo)
		},
		//用户退出当前登录，将缓存中的购物车清空
		CLEARCART(state) {
			state.cartInfo = {
				goodsCount: 0,
				cartList: []
			};
			uni.removeStorageSync("cartInfo")
		}
	},
	actions: {
		async addCart({commit,dispatch}, goodObj) {
			//调接口判断购物车中是否已经存在该商品
			const res = await myRequest({
				method: 'POST',
				url: '/api/cart/isExist',
				data: goodObj
			})
			//数据库中不存在该商品，则将goodsCount加1，否则直接添加到数据库
			if (res.data.code != 200) {
				commit('ADDCART', goodObj)
			}
			//调用接口将商品信息存入数据库
			const resp = await myRequest({
				method: 'POST',
				url: '/api/cart/add',
				data: goodObj
			})
			if (resp.data.code == 200) {
				uni.showToast({
					title: '添加成功',
					icon: 'success'
				})
			}
			dispatch('getCart', userAbout.state.userInfo.id)
		},
		//注意在actions中调用另外一个方法时的写法，getCart({commit,dispatch}, id) 
		async getCart({commit,dispatch}, id) {
			const res = await myRequest({
				url: '/api/cart/list',
				data: {
					checked: 'checked',
					userId: id
				}
			})
			console.log('getCart', res)
			if (res.data.data.length != 0) {
				let list = res.data.data
				dispatch('setCart', list);
			} else {
				uni.showToast({
					title: '购物车空空',
					duration: 1000,
					success() {
						setTimeout(() => {
							uni.switchTab({
								url: '/pages/index/index'
							})
						}, 1000)
					}
				})
			}
		},
		setCart({commit}, list) {
			commit('SETCART', list)
		},
		//这个方法没有什么意义，暂时放这里，需要的时候再调用
		clearCart({commit}, data) {
			commit('CLEARCART', data)
		}
	}
}
export default new Vuex.Store({
	modules: {
		userAbout,
		cartAbout
	}
})